package com.company.aicrawlers.analysis;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * 推荐强度判断器
 *
 * @author AI Crawlers Team
 * @date 2025-10-11
 */
@Slf4j
@Component
public class StrengthJudge {

    /**
     * 强推荐关键词
     */
    private static final List<String> STRONG_KEYWORDS = Arrays.asList(
            "强烈推荐", "首选", "最佳", "首推", "第一选择",
            "最推荐", "极力推荐", "首先推荐", "强推",
            "必买", "最值得", "首要", "冠军"
    );

    /**
     * 弱推荐关键词
     */
    private static final List<String> WEAK_KEYWORDS = Arrays.asList(
            "如果", "也可以", "或者", "备选", "也行",
            "如果预算", "如果不介意", "也能", "凑合",
            "可以考虑", "也算", "将就"
    );

    /**
     * 判断推荐强度
     *
     * @param fullText 完整文本（包含商品提及的上下文）
     * @param ranking  商品排名
     * @return strong/medium/weak
     */
    public String judge(String fullText, int ranking) {
        if (fullText == null) {
            fullText = "";
        }

        // 规则1：排名第1 且 有强推荐词 → strong
        if (ranking == 1 && containsAny(fullText, STRONG_KEYWORDS)) {
            log.debug("判断为strong：排名第1且有强推荐词");
            return "strong";
        }

        // 规则2：排名第1 → strong
        if (ranking == 1) {
            log.debug("判断为strong：排名第1");
            return "strong";
        }

        // 规则3：有弱推荐词 → weak
        if (containsAny(fullText, WEAK_KEYWORDS)) {
            log.debug("判断为weak：有弱推荐词");
            return "weak";
        }

        // 规则4：排名2-3 → medium
        if (ranking >= 2 && ranking <= 3) {
            log.debug("判断为medium：排名2-3");
            return "medium";
        }

        // 规则5：排名4+ → weak
        if (ranking >= 4) {
            log.debug("判断为weak：排名4+");
            return "weak";
        }

        // 默认：medium
        log.debug("判断为medium：默认");
        return "medium";
    }

    /**
     * 判断文本中是否包含任一关键词
     *
     * @param text     文本
     * @param keywords 关键词列表
     * @return 是否包含
     */
    private boolean containsAny(String text, List<String> keywords) {
        if (text == null || text.isEmpty()) {
            return false;
        }

        for (String keyword : keywords) {
            if (text.contains(keyword)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 获取推荐强度的中文描述
     *
     * @param strength 强度代码
     * @return 中文描述
     */
    public String getStrengthDescription(String strength) {
        switch (strength) {
            case "strong":
                return "强推荐";
            case "medium":
                return "中等推荐";
            case "weak":
                return "弱推荐";
            default:
                return "未知";
        }
    }
}

